package com.per.mybootall.service.impl;


import com.alipay.api.AlipayResponse;

import com.alipay.api.response.AlipayTradePrecreateResponse;

import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.ExtendParams;
import com.alipay.demo.trade.model.GoodsDetail;
import com.alipay.demo.trade.model.builder.*;

import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;

import com.alipay.demo.trade.service.AlipayTradeService;

import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;

import com.per.mybootall.common.Const;
import com.per.mybootall.dao.OrderMapper;
import com.per.mybootall.dao.ProductMapper;
import com.per.mybootall.pojo.Order;
import com.per.mybootall.service.AlipayInter;
import com.per.mybootall.service.OrderInter;
import com.per.mybootall.utils.BigDecimalUtil;


import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.*;
@Service
public class Alipayimpl  implements AlipayInter {
    // 支付宝当面付2.0服务

    @Resource
    private OrderMapper orderMapper;
    @Resource
    private ProductMapper productMapper;

    private static AlipayTradeService   tradeService;

    private static final Log log = LogFactory.getLog(Alipayimpl.class);


    // 简单打印应答
    private void dumpResponse(AlipayResponse response) {
        if (response != null) {
            log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));
            if (StringUtils.isNotEmpty(response.getSubCode())) {
                log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),
                        response.getSubMsg()));
            }
            log.info("body:" + response.getBody());
        }
    }


    // 测试当面付2.0生成支付二维码（参数：productName,OrderID订单号）===>>返回支付宝二维码路径
    @Override
    public String test_trade_precreate(String productName, int OrderID, Integer productNumbe, double producrPrice, Integer productid) {

       // AlipayTradeService   tradeService = new AbsAlipayTradeService();
        System.out.println("====================================================================================================");
        System.out.println("====================================================================================================");

        System.out.println("支付过程中的订单号为："+OrderID);

        String msg="";
        // (必填) 商户网站订单系统中唯一订单号，64个字符以内，只能包含字母、数字、下划线，
        // 需保证商户系统端不能重复，建议通过数据库sequence生成，
        String outTradeNo = String.valueOf(OrderID);

        // (必填) 订单标题，粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
        String subject = "微天下门店"+productName+"品牌当面付扫码消费";

        // (必填) 订单总金额，单位为元，不能超过1亿元
        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
       BigDecimal allMoney= BigDecimalUtil.mul(producrPrice,productNumbe);
        String totalAmount =String.valueOf(allMoney);

        // (可选) 订单不可打折金额，可以配合商家平台配置折扣活动，如果酒水不参与打折，则将对应金额填写至此字段
        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
        String undiscountableAmount = "0";

        // 卖家支付宝账号ID，用于支持一个签约账号下支持打款到不同的收款账号，(打款到sellerId对应的支付宝账号)
        // 如果该字段为空，则默认为与支付宝签约的商户的PID，也就是appid对应的PID
        String sellerId = "";

        // 订单描述，可以对交易或商品进行一个详细地描述，比如填写"购买商品2件共15.00元"
        String body = "购买商品"+productNumbe+"件共"+allMoney+"元";

        // 商户操作员编号，添加此参数可以为商户操作员做销售统计
        String operatorId = "test_operator_id";

        // (必填) 商户门店编号，通过门店号和商家后台可以配置精准到门店的折扣信息，详询支付宝技术支持
        String storeId = "test_store_id";

        // 业务扩展参数，目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法)，详情请咨询支付宝技术支持
        ExtendParams extendParams = new ExtendParams();
        extendParams.setSysServiceProviderId("2088100200300400500");

        // 支付超时，定义为120分钟
        String timeoutExpress = "120m";

        // 商品明细列表，需填写购买商品详细信息，
        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
        // 创建一个商品信息，参数含义分别为商品id（使用国标）、名称、单价（单位为分）、数量，如果需要添加商品类别，详见GoodsDetail
        GoodsDetail goods1 = GoodsDetail.newInstance(String.valueOf(productid), productName, (long) producrPrice, productNumbe);

        // 创建好一个商品后添加至商品明细列表
        goodsDetailList.add(goods1);

        // 继续创建并添加第一条商品信息，用户购买的产品为“黑人牙刷”，单价为5.00元，购买了两件
//        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
//        goodsDetailList.add(goods2);

        // 创建扫码支付请求builder，设置请求参数
        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
                .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo)
                .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body)
                .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams)
                .setTimeoutExpress(timeoutExpress)
                .setNotifyUrl("http://localhost:8080/alipayCallBack")
                //支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置(支付宝的回调地址,内网穿透+mapping)

                .setGoodsDetailList(goodsDetailList);

        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
         *  Configs会读取classpath下的zfbinfo.properties文件配置信息，如果找不到该文件则确认该文件是否在classpath目录
         */
        Configs.init("zfbinfo.properties");

        /** 使用Configs提供的默认参数
         *  AlipayTradeService可以使用单例或者为静态成员对象，不需要反复new
         */
        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();


        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);

        switch (result.getTradeStatus()) {
            case SUCCESS:
                log.info("支付宝预下单成功: )");
                System.out.println("支付宝预下单成功: )");

                AlipayTradePrecreateResponse response = result.getResponse();
                dumpResponse(response);

                String uuidPhoto= UUID.randomUUID().toString();

                String path="D:\\boot\\mybootall\\src\\main\\resources\\static\\alipayPhoto";
                File file=new File(path);

                if(!file.exists()){
               file.mkdirs();
                }

                // 需要修改为运行机器上的路径
                String qrPath= String.format(path+"/qr-%s.png",
                        uuidPhoto);

              String qrFileName=String.format("qr-%s.png",uuidPhoto);

                log.info("filePath:" + qrPath);
                System.out.println("二维码生成地址：filePath:" + qrPath);

                System.out.println("AliPay:responser:"+response.getQrCode());

                //根据ZxingUtils工具类：根据路径生成二维码持久化的文件
                //                ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath);



                return response.getQrCode();

            case FAILED:
                log.error("支付宝预下单失败!!!");
                 msg="支付宝预下单失败!!!";
                return msg;

            case UNKNOWN:
                log.error("系统异常，预下单状态未知!!!");
                 msg="系统异常，预下单状态未知!!!";
                return msg;

            default:
                log.error("不支持的交易状态，交易返回异常!!!");
                msg="不支持的交易状态，交易返回异常!!!";
                return msg;
        }
    }



        //更改订单状态
    @Override
    public int updateOrderStatus(Integer orderid){
        Order order=new Order();
        order.setOrderEtat(1);
       int result= orderMapper.deleteByPrimaryKey(orderid);
       if(result==0){
           return Const.alipay.ORDER_UPDATEERROR;
       }
       return Const.alipay.ORDER_UPDATESUCCESS;
    }


        //减少库存，
    @Override
    public int delProductStock(Long id, int delHaoMumber){
        int stock=productMapper.selectStockForId(id)-delHaoMumber;

       int result= productMapper.updateProductStock(id,stock);
       if(result==0){
           return Const.alipay.ORDER_UPDATEERROR;
       }
       return Const.alipay.ORDER_UPDATESUCCESS;
    }
}
